package com.shujia.wyh.day03;

/*
        位运算：>>,>>>,<<

        <<左移：左移之后，右边用0补齐，左边多出来的丢弃
            实际上是乘上2的次幂
        >>右移：右移之后，如果最高位是0，就用0补齐，如果最高位是1，就用1补齐，右边多出来的丢弃
            实际上是除以2的次幂
        >>>无符号右移：右移之后，无论最高位是0还是1，都用0补齐，右边多出来的丢弃
 */
public class OptWeiDemo2 {
    public static void main(String[] args) {

        System.out.println(3 << 2); //12  3*4  3*2^2
        System.out.println(24 >> 2); //6  24/4  24/2^2
        System.out.println(24 >>> 2);

        System.out.println(-24 >> 2);
        System.out.println(-24 >>> 2); //1073741818

        System.out.println(3 << 4); //3*2^4
        System.out.println(24 >> 3); //24/2^3


        //面试题：请用异或实现两个数的交换
        int a = 100;
        int b = 200;
//        a = a ^ b ^ a;
//        System.out.println("a:" + a);
//        a = 100;
//        b = a ^ b ^ b;
//        System.out.println("b:" + b);
//        System.out.println(a ^ b);
//        System.out.println(a ^ b ^ b);
//        System.out.println(a ^ b ^ a);

        //定义中间变量实现
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a:" + a);
        System.out.println("b:" + b);


    }
}

/*
        分析：要想参与位运算，就必须要先得知道二进制
        1、计算出3得二进制：11
           00000000 00000000 00000000 00000011  3的原码，反码，补码
       (00)00000000 00000000 00000000 00001100
           结果是：12

        2、计算出24的二进制：11000
           00000000 00000000 00000000 00011000  24的原码，反码，补码
           0000000000 00000000 00000000 000110(00)
           结果是：6

        3、计算出24的二进制：11000
           00000000 00000000 00000000 00011000  24的原码，反码，补码
           0000000000 00000000 00000000 000110(00)
           结果是：6

        4、计算出24的二进制：11000
           -24的原码：10000000 00000000 00000000 00011000
           -24的反码：11111111 11111111 11111111 11100111
           -24的补码：11111111 11111111 11111111 11101000

           右移2位：
            补码：1111111111 11111111 11111111 111010(00)
            反码：1111111111 11111111 11111111 111001
            原码：1000000000 00000000 00000000 000110
            结果是：-6

        5、计算出24的二进制：11000
           -24的原码：10000000 00000000 00000000 00011000
           -24的反码：11111111 11111111 11111111 11100111
           -24的补码：11111111 11111111 11111111 11101000

           无符号右移2位：
            补码：0011111111 11111111 11111111 111010(00)
            结果是：1073741818





 */
